i> 安裝 :
!pip install -q sentence-transformers faiss-cpu chromadb
ii> 準備資料 : 先讀取 CSV 並把問題或答案載入變成 list
# 讀檔 & 產生 embeddings(Colab)
import os
import pandas as pd
from sentence_transformers import SentenceTransformer
import numpy as np
# 讀入 CSV
df = pd.read_csv("faqs.csv", encoding="utf-8-sig")
print("FAQ 筆數:", len(df))
print(df.head())
# 選要 embed 的欄位(通常用 question 或 question+answer)
texts = df["question"].astype(str).tolist()
# 載入 sentence-transformers model
model_name = "paraphrase-multilingual-MiniLM-L12-v2" # 小且支援中文
embedder = SentenceTransformer(model_name)
# 產生 embeddings(轉成 numpy float32)
embeddings = embedder.encode(texts, convert_to_numpy=True, show_progress_bar=True)
embeddings = embeddings.astype("float32")
print("embeddings shape:", embeddings.shape)
iii> FAISS (提供高效算法來快速搜索和聚類嵌入向量的庫):建立索引、查詢、儲存/讀取
import faiss
# 取得 embedding 維度
d = embeddings.shape[1]
# 1) L2 normalize(必要:使 inner-product 等同 cosine)
faiss.normalize_L2(embeddings)
# 建立 Index(這裡用 L2 距離,可以換 inner product / cosine)
index = faiss.IndexFlatL2(d)
# 加入向量
index.add(embeddings)
print("FAISS 資料庫筆數:", index.ntotal)
# 3) 一個 query 的測試
def faiss_search(query_text, k=3):
q_emb = embedder.encode([query_text], convert_to_numpy=True).astype("float32")
faiss.normalize_L2(q_emb)
D, I = index.search(q_emb, k) # D: scores, I: indices
results = []
for score, idx in zip(D[0], I[0]):
results.append({
"score": float(score),
"id": df.iloc[idx]["id"],
"question": df.iloc[idx]["question"],
"answer": df.iloc[idx]["answer"]
})
return results
# 範例查詢
q = "我要退貨要怎麼做?"
print("Query:", q)
for r in faiss_search(q, k=3):
print(r)
# 4) 儲存 index(及 metadata)
faiss.write_index(index, "faiss_index.bin")
np.save("faq_embeddings.npy", embeddings)
df.to_csv("faqs_with_index.csv", index=False, encoding="utf-8-sig")
print("已儲存 faiss_index.bin / faq_embeddings.npy / faqs_with_index.csv")
結果 :
FAISS 資料庫筆數: 10
Query: 我要退貨要怎麼做?
{'score': 0.37788718938827515, 'id': 'q1', 'question': '如何申請退貨?', 'answer': '請於訂單頁點選退貨申請並上傳商品照片,客服將於 3 個工作天內處理。'}
{'score': 0.883316159248352, 'id': 'q4', 'question': '付款方式有哪些?', 'answer': '我們支援信用卡、LINE Pay 與貨到付款。'}
{'score': 1.202573537826538, 'id': 'q10', 'question': '如何使用優惠券?', 'answer': '在結帳頁面輸入優惠碼,系統會自動折抵。'}
已儲存 faiss_index.bin / faq_embeddings.npy / faqs_with_index.csv